有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从内部类访问扩展类的方法

public class ABC extends XYZ
{
          public static class InnerClass1
          {
            ...
          }
          public static class InnerClass2
          {
            ...
          }
          public static class InnerClass3
          {
            ...
          }
          public static class InnerClass4
          {
            ...
          }
}

在上面的代码中,我无法访问内部类1、2、3和4中的类XYZ的方法。如何修改上述结构,以便内部类可以访问类XYZ中的方法

提前谢谢


共 (3) 个答案

  1. # 1 楼答案

    静态内部类只能访问外部类的静态成员

    因此内部类只能使用xyz的静态成员

    如果想访问所有内容,请创建非静态的内部类

  2. # 2 楼答案

    您有两个选项,一个是删除静态调用,以便内部类实例可以使用对外部类的隐藏this引用,另一个是在显式this中创建内部类过程的实例时,例如:

    public class ABC extends XYZ
    {
         XYZ.InnerClass innerInst = new InnerClass(this);
    
              public static class InnerClass1
              {
                private final ABC extref;
                public void Innerclass(ABC outerref) 
                {
                    extref = outerref;
                }
    
                ...
              }
    }
    
  3. # 3 楼答案

    public class ABC extends XYZ
    {
          public static class InnerClass1
          {
            ...
          }
    

    InnerClass1不是内部类。由于单词^{,它是一个嵌套的类

    如果没有static,它将是一个内部类。该内部类的任何实例都会有一个对ABC(也是XYZ)的隐藏引用。如果内部类调用了ABCXYZ的任何实例方法,或引用了这些类中的任何实例变量,它将使用该隐藏引用调用实例方法或访问实例变量

    不过,由于它是一个嵌套类,所以没有对ABC(或XYZ)的隐藏引用。因此,如果调用一个实例方法或引用一个实例变量,它就不能这样做,因为没有ABC对象可以使用。(但是,您仍然可以调用ABC静态方法,或者引用静态变量。)

    我不确定解决方案是什么,这取决于你的需要。无法调用的XYZ方法可能实际上不需要XYZ对象来处理,因此这些方法应该是静态的。嵌套类也可能有一些显式的ABCXYZ变量,用于访问实例方法;如果有对象要处理,仍然可以从嵌套类调用实例方法:

    public static class NestedClass {
        XYZ x;
        void someMethod() { 
           x.instanceMethod();  // legal even if instanceMethod is non-static
        }
    }
    

    另一种解决方案是删除单词static,这样InnerClass1就真的有一个对ABC的隐藏引用。这意味着,当创建InnerClass1实例时,需要一些ABC对象供其引用。如果您在其他类中创建这个,语法将类似于

    ABC abcObject;
    ...
    ABC.InnerClass1 newObject = abcObject.new InnerClass1();